package com.jai.pms.service.impl;

import com.jai.pms.domain.BaseDataEntity;
import com.jai.pms.domain.ProjectData;
import com.jai.pms.mapper.BaseDataMapper;
import com.jai.pms.mapper.ProjectDataMapper;
import com.ruoyi.common.core.exception.ServiceException;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;

/**
 * 数据类型的Service业务层基类
 *
 * @author jai
 * @date 2023-10-26
 */
@Service
public class BaseDataImpl {
    @Autowired
    private ProjectDataMapper projectDataMapper;

    @Autowired
    private SqlSession sqlSession;

    /**
     * 获取项目中的数据信息
     *
     * @param projectId 项目编号
     * @param dataCode  数据编码
     * @return
     */
    public ProjectData getProjectData(Long projectId, String dataCode) {
        HashMap<String, Object> params = new HashMap<>();
        params.put("projectId", projectId);
        params.put("dataCode", dataCode);
        return projectDataMapper.selectProjectDataByCode(params);
    }

    /**
     * 获取父类数据
     *
     * @param projectId  项目编号
     * @param code       父类编码
     * @param parentData 父类数据
     * @return 查询出来的父类
     */
    public BaseDataEntity getParentData(Long projectId, String code, String parentData) {
        try {

            // 检查父类
            if (parentData == null || parentData.equals("")) {
                return null;
            }
            parentData = parentData.substring(0, 1).toUpperCase() + parentData.substring(1).toLowerCase();
            String mapperClassName = "com.jai.pms.mapper." + parentData + "Mapper";
            Class<BaseDataMapper> c = (Class<BaseDataMapper>) Class.forName(mapperClassName);
            BaseDataMapper mapper = sqlSession.getMapper(c);
            HashMap<String, Object> params = new HashMap<>();
            params.put("code", code);
            params.put("projectId", projectId);
            return mapper.findByCode(params);
        } catch (ClassNotFoundException e) {
            throw new ServiceException("父类中不存在此编码 !");
        }
    }

    /**
     * 获取父类的详细信息
     *
     * @param projectId  项目编号
     * @param dataCode   当前数据类型编码
     * @param parentCode 父类编码
     * @return 父类详细信息
     */
    public BaseDataEntity getParent(Long projectId, String dataCode, String parentCode) {
        // 先根据projectId和dataCode查找自己这种数据类型是否在项目定义了
        ProjectData selfData = getProjectData(projectId, dataCode);
        if (selfData == null) {
            throw new ServiceException("项目中不存在此数据类型 !");
        }

        // 根据自己这种数据类型是否存在父类，分别处理
        if (selfData.getParentId() == 0) {
            // 不存在父类
            // 要求用户不能输入了父类
            if (parentCode != null && !parentCode.equals("")) {
                throw new ServiceException("该数据类型不存在父类 !");
            }

            // 返回一个空的父类
            BaseDataEntity parent = new BaseDataEntity();
            parent.setId(0L);
            parent.setCode("");
            parent.setName("");
            parent.setAncestors("0");
            return parent;
        } else {
            // 存在父类
            // 要求用户必须输入了父类
            if (parentCode == null || parentCode.equals("")) {
                throw new ServiceException("请输入父类 !");
            }

            // 根据父类编码查取父类的详细信息
            BaseDataEntity parent = getParentData(projectId, parentCode, selfData.getParentCode());
            if (parent == null) {
                throw new ServiceException("父类中不存在此编码 !");
            }

            parent.setAncestors(parent.getAncestors() + "," + parent.getId());
            return parent;
        }
    }
}
